#ifndef FLOWSCHEDULERDIALOG_H
#define FLOWSCHEDULERDIALOG_H

#include <QDialog>
#include <QVector>
#include <QModelIndexList>
#include "ui_flowschedulerdialog.h"
#include "TreeViewModel.h"
#include "flowOperationsDOModel.h"
#include "flowOperationsListModel.h"
#include "FlowPropertiesModel.h"
#include "HdaOperationThread.h"
#include "hdaprogressbar.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>	FlowSchedulerDialog class enables the user to preform various operations 
///				on the given project</summary>
///
/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////

class FlowSchedulerDialog : public QDialog
{
	Q_OBJECT

public:
	FlowSchedulerDialog(QWidget *parent = 0);	
	FlowSchedulerDialog(QWidget *parent, TreeViewModel* model);
	~FlowSchedulerDialog();

private:
	Ui::FlowSchedulerDialog ui;	
	/// Project tree
	TreeViewModel* _manuscriptTreeModel;
	/// All possible operations to perform
	FlowOperationsListModel* _flowOperationsListModel;
	/// Selected operations to perform
	FlowOperationsDOModel* _flowSelectedOperationsListModel;
	/// Operation's properties
	FlowPropertiesModel* _flowPropertiesModel;
	/// Each job's progress bar
	QVector<HdaProgressBar*> _progressBars;
	/// Stores each selected operations (for free memory purpose)
	QVector<OperationDO*> _allOperationsDo;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Returns checked pages to perform operations on. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	/// <param name="lst">	[in] The tree's indexes. </param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QModelIndexList getCheckedPages(QModelIndexList lst);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Returns selected operations. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QVector<OperationDO*> getSelectedOperations();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Create an OperationDO. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	/// <param name="type">	[in] The operation type. </param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	OperationDO* createOperationDO(QString type);
	

public slots:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Adds operation to the current flow. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void addOperation();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Starts the flow. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void startFlow();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Cancels the flow. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void cancelFlow();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Clears the operations list. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void clearOperations();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Clears the list of finished jobs. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void clearDone();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Moves selected operation up. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void moveUp();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Moves selected operation down. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void moveDown();	

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Shows operation's properties. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void showProperties(QModelIndex index);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Updates project tree. </summary>
	///
	/// <remarks>	Etay Tchechanovski, 1/5/2012. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void updateTree(TreeViewModel*);
};

#endif // FLOWSCHEDULERDIALOG_H

